package com.ay.java.proxy.controller;

import com.ay.java.proxy.cglibproxy.CglibProxy;
import com.ay.java.proxy.jdkproxy.JdkProxy;
import com.ay.java.proxy.service.CglibUserService;
import com.ay.java.proxy.service.UserService;
import com.ay.java.proxy.service.impl.UserserviceImpl;

/**
 * @Author: ay
 * @Date: 2021/6/11
 * @Description:   调用方控制器
 **/
public class UserController {

    public static void main(String[] args) {
        UserController userController = new UserController();
        // 构造真实对象
        UserService userService = new UserserviceImpl();
        CglibUserService cglibUserService = new CglibUserService();
        //jdk动态代理
//        userController.jdkProxy(userService);
        //cglib动态代理
        userController.cglibProxy(cglibUserService);
    }


    /**
     * jdk动态代理
     * 被代理类必须实现接口
     * 代理类需要实现 InvocationHandler 接口
     * 使用Proxy.newProxyInstance方法获取代理类
     * 所有被动态代理类的方法调用，都交由invoke方法处理
     * 在执行invoke方法前后可以执行增强逻辑
     * @param target 被代理类
     */
    private void jdkProxy(Object target){
        System.out.println("--------------jdk动态代理----------------------");
        //创建代理对象
        JdkProxy jdkProxy = new JdkProxy();
        UserService userService = (UserService) jdkProxy.createProxy(target);
        // 执行方法
        userService.add();
        userService.delete();
        userService.update();
        userService.query();
        System.out.println("--------------jdk动态代理----------------------");
    }


    /**
     * cglib动态代理
     * 被代理类不需要实现接口，可以代理普通java类
     * 动态代理类需要实现 MethodInterceptor 接口 实现interceptor方法
     * @param target 被代理类
     */
    private void cglibProxy(Object target){
        System.out.println("--------------cglib动态代理----------------------");
        //创建代理对象
        CglibProxy cglibProxy = new CglibProxy();
        CglibUserService userService = (CglibUserService) cglibProxy.createProxy(target);
        // 执行方法
        userService.add();
        userService.delete();
        userService.update();
        userService.query();
        System.out.println("--------------cglib动态代理----------------------");
    }
}
